package com.zzh.study.interfaces;


import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.zzh.study.utils.BaseException;

import java.util.Collection;

public interface Assert {
	
	/**
	 * 
	 * @Function newException
	 * @Description [创建异常对象]
	 * @param args
	 * @return
	 * @Return BaseException
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年6月11日 下午4:53:08 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	BaseException newException(Object... args);
	
	/**
	 * 
	 * @Function assertNotNull
	 * @Description [断言对象非空，否则抛出异常]
	 * @param obj
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年6月11日 下午4:54:52 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	default void assertNotNull(Object obj) {
		if (null == obj) {
			throw newException();
		}
	}
	
	/**
	 * 
	 * @Function assertNotNull
	 * @Description [断言对象非空，支持传递message占位符参数列表，否则抛出异常]
	 * @param obj
	 * @param args
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年6月11日 下午4:54:45 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	default void assertNotNull(Object obj, Object... args) {
		if (null == obj) {
			throw newException(args);
		}
	}
	
	/**
	 * 
	 * @Function assertConditionIsFalse
	 * @Description [断言表达式不为真，否则抛出异常]
	 * @param expression
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年6月11日 下午6:17:50 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	default void assertConditionIsFalse(Boolean expression) {
		if (expression) {
			throw newException();
		}
	}
	
	/**
	 * 
	 * @Function assertConditionIsFalse
	 * @Description [断言表达式不为真，支持传递message占位符参数列表，否则抛出异常]
	 * @param expression
	 * @param args
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年6月11日 下午6:17:50 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	default void assertConditionIsFalse(Boolean expression, Object... args) {
		if (expression) {
			throw newException(args);
		}
	}
	
	/**
	 * @Function assertCollectionIsNotEmpty
	 * @Description [断言指定集合不为空，否则抛出异常]
	 * @param collection
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年10月9日 下午3:39:00 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]     
	 */
	default void assertCollectionIsNotEmpty(Collection collection) {
		if (CollectionUtils.isEmpty(collection)) {
			throw newException();
		}
	}
	
	/**
	 * @Function assertCollectionIsNotEmty
	 * @Description [断言指定集合不为空，支持传递message占位符参数列表，否则抛出异常]
	 * @param collection
	 * @param args
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年10月9日 下午3:39:00 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]     
	 */
	default void assertCollectionIsNotEmpty(Collection collection, Object... args) {
		if (CollectionUtils.isEmpty(collection)) {
			throw newException(args);
		}
	}
	
	/**
	 * @Function assertCollectionIsNotEmty
	 * @Description [断言指定集合元素个数为指定个数，否则抛出异常]
	 * @param collection
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年10月9日 下午3:39:00 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]     
	 */
	default void assertCollectionSize(Collection collection, int elementSize) {
		if (null == collection || collection.size() != elementSize) {
			throw newException();
		} 
	}
	
	/**
	 * @Function assertCollectionIsNotEmty
	 * @Description [断言指定集合为空，否则抛出异常]
	 * @param collection
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年10月9日 下午3:39:00 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]     
	 */
	default void assertCollectionIsEmpty(Collection collection) {
		if (CollectionUtils.isNotEmpty(collection)) {
			throw newException();
		}
	}
	
	/**
	 * 
	 * @Function assertConditionIsTrue
	 * @Description [断言表达式为真，否则抛出异常]
	 * @param expression
	 * @Return void
	 * @version: v1.0.0
	 * @author mosc
	 * @CreateDate 2020年6月11日 下午6:17:50 
	 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	default void assertConditionIsTrue(Boolean expression) {
		if (!expression) {
			throw newException();
		}
	}
}
